package com.aspire.shiro;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

/**
 * shiro入门第一个案例
 * <p>
 * 过程思路:   创建工厂-->通过工厂实例化安全管理器-->使用工具(SecurityUtils)指定安全管理器-->
 * 使用工具(SecurityUtils)获取主体-->构建账号密码-->主体带着账号密码去-->与ini配置的账号密码去匹配
 */
public class HelloShiro {

    @Test
    public void permissionRealm() {
        //先调用认证
        Subject subject = HelloShiro();
        //输出结果是否登录成功
        System.out.println("登录的结果是:" + (subject.isAuthenticated() ? "成功" : "失败"));
        //校验是否有对应的角色-->subject.hasRole返回值是boolean
        System.out.println("当前用户是否拥有develop的角色："+(subject.hasRole("develop")?"有":"没有"));
        System.out.println("当前用户是否拥有admin的角色："+(subject.hasRole("admin")?"有":"没有"));
        System.out.println("当前用户是否拥有manager的角色："+(subject.hasRole("manager")?"有":"没有"));
        //校验当前用户时候拥有角色-->subject.checkRole没有返回值，没有的话会抛出异常
        try {
            subject.checkRole("manager");
            System.out.println("当前用户有manager的角色");
        } catch (AuthorizationException e) {
            System.out.println("当前用户没有manager的角色");
        }


        //校验当前用户的权限信息-->subject.isPermitted返回值是boolean
        System.out.println("当前用户是否拥有查看订单的权限："+(subject.isPermitted("order:select")?"有":"没有"));
        System.out.println("当前用户是否拥有修改订单的权限："+(subject.isPermitted("order:update")?"有":"没有"));
        System.out.println("当前用户是否拥有新增订单的权限："+(subject.isPermitted("order:add")?"有":"没有"));
        //校验当前用户的权限信息-->subject.isPermitted返回值是boolean
        try {
            subject.checkPermission("order:add");
            System.out.println("当前用户有新增订单的权限");
        } catch (AuthorizationException e) {
            System.out.println("当前用户没有新增订单的权限");
        }
    }


    public Subject HelloShiro() {
        //导入ini配置
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //工厂构建安全管理器
        SecurityManager instance = factory.getInstance();
        //使用securityUtils工具生效安全管理器
        SecurityUtils.setSecurityManager(instance);
        //使用securityUtils工具获得主体(也就是subject对象)
        Subject subject = SecurityUtils.getSubject();
        //构建账号token
        UsernamePasswordToken token = new UsernamePasswordToken("admin", "admin");
        //登录操作(验证用户名密码)
        subject.login(token);
        return subject;
    }

}
